perm filename NEWMRK.F4[1,LCS] blob
sn#669856 filedate 1982-07-27 generic text, type T, neo UTF8
00100 C**** NEWMRK.F4 *****
00200 COPYRIGHT 1982 BY LELAND SMITH
00300 C************ READX, NEWMRK, ISNUM, DOIT, MORMRK, DASHES, CPYALL, CMDIN *******
00400
00500 SUBROUTINE READX
00600 COMMON R2,JA,CENTR,J2,RJQ(20),JQ(20) /ALF/INP(72)/SCM/V(78)
00700 EQUIVALENCE (V(2),V2)
00800 C****320 REREAD 2430,J,R2,RJQ
00900 C ↑↑↑ 1/78
01000 DO 2 K=2,72
01100 IF(INP(K).NE.'<')GO TO 2
01200 DO 3 J=K,72
01300 3 INP(J)=' '
01400 GO TO 4
01500 2 CONTINUE
01600 C CATCH '<' -- WHICH = COMMENT FOR REST OF LINE
01700 4 CALL RREAD(INP,V)
01800 JA=V(1)
01900 R2=V2
02000 DO 1 K=1,20
02100 1 RJQ(K)=V(K+2)
02200 END
02300
02400 FUNCTION ISNUM(M)
02500 C ISNUM=0 IF M=A NUMBER. ASSUMES A DOT MEANS DECIMAL POINT
02600 ISNUM=-1
02700 IF(M.EQ.'.')ISNUM=0
02800 IF(M.GE.'0'.AND.M.LE.'9')ISNUM=0
02900 END
03000
03100 SUBROUTINE NEWMRK(VX)
03200 DIMENSION VX(1)
03300 COMMON /DPY/ST(3690),N(1),N2,N3,JN(72),KN(172),RX(50),JJ,NN,MM
03400 1 /SC/A,B,C,D,E,NNN /ALF/INP(1) /MX/MX,MZ
03500 DO 40 J=1,72
03600 M=INP(J)
03700 C CHANGES /C 7 12/ TO /C 7:12/ ETC.
03800 IF(M.EQ.'*')GO TO 41
03900 IF(M.NE.'C'.AND.M.NE.'O')GO TO 40
04000 IF(INP(J+1).EQ.'R')GO TO 40
04100 NN=-1
04200 N2=J+1
04300 44 DO 42 MM=N2,72
04400 JJ=INP(MM)
04500 IF(JJ.EQ.'/')GO TO 40
04600 IF(JJ.EQ.'*'.OR.JJ.EQ.';')GO TO 41
04700 IF(ISNUM(JJ).NE.0)GO TO 42
04800 C NOW FOUND A NUMBER. NEXT LOOK FOR SPACE.
04900 DO 43 MX=MM+1,72
04950 JJ=INP(MX)
04975 IF(JJ.EQ.'/')GO TO 40
05000 IF(JJ.NE.' '.AND.JJ.NE.':')GO TO 43
05100 IF(NN.LT.0)INP(MX)=':'
05200 C INSERT : AFTER EVERY OTHER NUMBER.
05300 NN=-NN
05400 N2=MX+1
05500 GO TO 44
05600 43 CONTINUE
05700 42 CONTINUE
05800 40 CONTINUE
05900 41 J=1
06000 34 J=J+1
06100 35 IF(ISNUM(INP(J)).NE.0)GO TO 30
06200 DO 31 MM=J+1,72
06300 M=INP(MM)
06400 IF(M.EQ.'/')GO TO 30
06500 IF(M.EQ.';')GO TO 30
06600 IF(M.EQ.'*')GO TO 30
06700 IF(M.NE.' ')GO TO 31
06800 C NOW FOUND SPACE AFTER NUMB.
06900 DO 32 J=MM+1,72
07000 M=INP(J)
07100 IF(M.EQ.' ')GO TO 32
07200 IF(ISNUM(M).NE.0)GO TO 30
07300 C FOUND SOMETHING, BUT NOT NUMB.
07400 INP(MM)=','
07500 C FOUND NUMB, SO PUT IN COMMA
07600
07700 IF(J.LT.72)GO TO 35
07800 GO TO 33
07900 32 CONTINUE
08000 GO TO 33
08100 31 CONTINUE
08200 GO TO 33
08300 30 IF(J.LT.72)GO TO 34
08400 33 MX=0
08500 C MX IS FLAG FOR LINE TOO LONG IN NEW FORMAT
08600 J=0
08700 MM=0
08800 10 JJ=0
08900 NN=0
09000 N2=0
09100 1 J=J+1
09200 IF(J.GT.72)GO TO 20
09300 C JUMP IF DONE
09400 M=INP(J)
09500 CURRENT CHARACTER
09600 IF(M.EQ.'-')GO TO 21
09700 C '-' NEEDED FOR "C-" (DECRESC. SIGN)
09800 IF(M.LT.'A'.OR.M.GT.'Z')GO TO 2
09900 C JUMP IF A LETTER IS NOT FOUND
10000 21 JJ=JJ+1
10100 N(JJ)=M
10200 GO TO 1
10300 2 IF(M.EQ.' ')GO TO 1
10400 5 NN=NN+1
10500 JN(NN)=M
10600 C SAVE THE NUMBER CHARS.
10700 6 J=J+1
10800 M=INP(J)
10900 CC IF(M.GE.'0'.AND.M.LE.'9')GO TO 5
11000 CC IF(M.EQ.'.')GO TO 5
11100 IF(ISNUM(M).EQ.0)GO TO 5
11200 CXX IF(M.NE.':')GO TO 22
11300 IF(M.NE.'!')GO TO 22
11400 M='-'
11500 C NEG. N2 WILL =TOTAL OF ITEMS STARTING WITH N1( /S 12!3/=/S 12:14/)
11600 NN=NN+1
11700 JN(NN)=' '
11800 GO TO 5
11900 22 IF(M.EQ.' ')GO TO 6
12000 IF(M.NE.':')GO TO 7
12100 C NOW A SEQUENCE OF ITEMS
12200 M=' '
12300 GO TO 5
12400 7 IF(M.NE.',')GO TO 8
12500 C NOW A SINGLE ITEM
12600 CALL DOIT
12700 NN=0
12800 C ITEM OR ITEMS NOW FINISHED
12900 GO TO 6
13000 8 IF(M.NE.'/')GO TO 11
13100 CALL DOIT
13200 GO TO 10
13300 11 IF(M.NE.';'.AND.M.NE.'*')GO TO 6
13400 C JUMP IF UNKNOWN CHAR.
13500 CALL DOIT
13600 KN(MM)=M
13700 IF(MM.LE.71)GO TO 20
13800 C SKIP IF REVISED LINE NOT TOO LONG
13900 MZ=MM
14000 DO 201 MM=71,1,-1
14100 201 IF(KN(MM).EQ.'/')GO TO 202
14200 202 MX=MM+1
14300 C POINTS TO START OF REMAINDER OF TOO-LONG LINE
14400 INP(72)=0
14500 20 CALL MORMRK(1,MM,VX)
14600 END
14700
14800 SUBROUTINE DOIT
14900 COMMON /DPY/ST(3690),N(1),N2,N3,JN(72),KN(172),RX(50),JJ,NN,MM
15000 IF(N(1).NE.'C'.AND.N(1).NE.'O')GO TO 3
15100 CATCHES /C 5-7/C- 11.2-13.5/O 1-21/ ETC.
15200 IF(N2.EQ.'R')GO TO 3
15300 C JUMP IF "CR" FOR WORD "CRESC."
15400 DO 4 K=1,NN
15500 MM=MM+1
15600 JX=JN(K)
15700 KN(MM)=JX
15800 4 IF(JX.EQ.' ')GO TO 5
15900 C FIRST NUMBER COMPLETED
16000 5 DO 6 JX=1,JJ
16100 MM=MM+1
16200 6 KN(MM)=N(JX)
16300 CODE LETTER INSERTED
16400 MM=MM+1
16500 KN(MM)=' '
16600 DO 7 JX=K+1,NN
16700 C NOW PUT IN LAST NUMBER
16800 MM=MM+1
16900 7 KN(MM)=JN(JX)
17000 GO TO 8
17100 3 DO 1 K=1,NN
17200 MM=MM+1
17300 1 KN(MM)=JN(K)
17400 MM=MM+1
17500 KN(MM)=' '
17600 DO 2 K=1,JJ
17700 MM=MM+1
17800 2 KN(MM)=N(K)
17900 C NOW PUT IN THE CODE WORD
18000 8 MM=MM+1
18100 KN(MM)='/'
18200 CLOSE OFF THE ITEM
18300 END
18400
18500 CC SUBROUTINE MORMRK(VX)
18600 SUBROUTINE MORMRK(MA,MB,VX)
18700 DIMENSION VX(1)
18800 COMMON /DPY/ST(3690),N(1),N2,N3,JN(72),KN(172),RX(50),JO,NN,MM
18900 1 /SC/A,B,C,D,E,NNN /ALF/INP(1) /MX/MX,MZ
19000 CC K=0
19100 MM=0
19200 C GET THE REST OF A TOO-LONG LINE
19300 DO 1 K=MA,MB
19400 CC DO 1 J=MX,MZ
19500 MM=MM+1
19600 CC K=K+1
19700 1 INP(MM)=KN(K)
19800 CC1 INP(K)=KN(J)
19900 CC MM=K
20000 DO 13 K=MM+1,72
20100 13 INP(K)=' '
20200 IF(INP(MM).EQ.'*')INP(72)='*'
20300 C LINE ENDS WITH * OR ;
20400 C NOW GO FIX UP THE VX ARRAY.
20500 3 CALL RREAD(INP,VX)
20600 DO 23 K=1,50
20700 X=VX(K)
20800 IF(X.GT.0)Z=X
20900 C SAVE THE LAST POSITIVE NUM.
21000 IF(X.LT.0)VX(K)=-X+Z-1.
21100 C /S 17:5/=/S 17-21/ I.E. 5 NOTES STACCATO, STARTING WITH 17
21200 23 CONTINUE
21300 999 NNN=VX(1)
21400 CC MX=0
21500 END
21600
21700 SUBROUTINE DASHES(IX,R2,RD)
21800 CC SUBROUTINE DASHES(IX,R2,R3,R4,R5,R6)
21900 DIMENSION RD(1)
22000 C R3=RD(1) R4=RD(2) . . . R7=RD(5) R8=RD(6) . . .
22100 COMMON /XRN/RN(3000)/PTR/KWDS(350)/DL/K22 /STF/RSTFAC(0/7),RSTJ2
22200 DATA RDX/2.3/,RDZ/0.5/,BSIZE/3.17/
22300 C FIND CLOSEST WORD TO LFT AND RIGHT OF R3 BSIZE=BASIC SIZE OF 1 LETTER
22400 IF(RD(8).EQ.0)RETURN
22500 C P10 MUST NOT!! BE ZERO.
22600 B=9999.0
22700 A=-B
22800 LFT=0
22900 JRT=0
23000 DO 1 K=1,IX
23100 C GETS CODE NUM. J=PTR TO THAT ITEM.
23200 J=KWDS(K)
23300 5 IF(RN(J+1).NE.16)GO TO 1
23400 C FOUND WORD
23500 IF(RN(J+2).NE.R2)GO TO 1
23600 C NOW ON THIS STAFF
23700 IF(ABS(RN(J+4)-RD(2)).GT.4.)GO TO 1
23800 C P4 OF DASH MUST BE WITHIN +4, -4 VERTICAL STEPS OF WORD ON EITHER SIDE.
23900 7 RR3=RN(J+3)
24000 IF(RR3.GT.RD(1))GO TO 3
24100 IF(RR3.LE.A)GO TO 1
24200 A=RR3
24300 LFT=J
24400 C A WILL BE POS. OF FRONT OF LEFT GROUP. LFT IS PNTR.
24500 GO TO 1
24600 3 IF(RR3.GE.B)GO TO 1
24700 B=RR3
24800 JRT=J
24900 1 CONTINUE
25000 C WON'T WORK WITH OVERLAPPING WORDS!!!!
25100
25200 J=LFT
25300 IF(LFT.NE.0)GO TO 2
25400 IF(JRT.EQ.0)RETURN
25500 J=JRT
25600 2 SZ=RN(J+5)
25700 R5=SZ*RSTJ2
25800 C R=REAL SIZE FACTOR FOR SPACE RN(LFT+9) IS WIDTH OF GROUP TO LEFT.
25900 RP=R5*RN(J+9)+A
26000 IF(RP.LT.0)RP=3.0
26100 C RP=RIGHT SIDE OF LEFT CHAR. STRING.
26200 R3=RP
26300 IF(B.GT.201)B=201.
26400 R6=B-R5*BSIZE
26500 CC RR6=R6
26600 IF(R3.LT.0)R3=4.
26700 CX IF(R6.GT.201)R6=201.
26800 C 3.17 IS BASIC WIDTH OF MOST LETTERS
26900 IF(RD(5).EQ.0)GO TO 4
27000 C SKIP IF R7=0 (NO SHORT DASHES)
27100 A=B-RP-BSIZE*R5
27200 C DIST. FROM END OF LFT WD TO START OF RT WD. (LESS 2 CHAR SPACES)
27300 8 B=IFIX(A/(25.*R5))+1.
27400 C B=NUMB OF DASHES
27500 9 RR3=2.5*SZ
27600 C RR3 IS DASH WIDTH
27700 A=(A-B*2.5*R5)/(B+1.)
27800 C A=SPACE BETWEEN DASHES (P9) IF SPACE IS TOO SMALL MAKE LRG DASH.
27900 CCC IF(A.LT.RDZ)GO TO 11
28000 R3=RP+A
28100 10 R6=R6-RDZ
28200 CC10 R6=R3+(RR3+A)*B-RR3-RDZ
28300 RD(6)=RR3
28400 RD(7)=A/RSTJ2
28500 C P9(SPACE BETWEEN DASHES) REAL SIZE IS P9*RSTJ2
28600 CCC GO TO 4
28700 CCC11 RD(5)=0
28800 4 RD(2)=RN(J+4)+1.0-R5*0.5
28900 C SET HEIGHT OF DASH CONSIDERS LETTER SIZE AND STAFF SIZE
29000 RD(3)=RD(2)
29100 C WAS R5=R4
29200 RD(1)=R3
29300 IF(R6-R3.LT.0.2)R6=R3+0.2
29400 RD(4)=R6
29500 END
29600
29700 SUBROUTINE CPYALL
29800 C COPIES ALL OF ONE CODE NUM. FROM ONE STAFF TO ALL OTHER ACTIVE STAVES.
29900 COMMON /LIMIT/LIMIT,ITEM,L,I /PTR/KWDS(1) /POSI/S(8),JJ2
30000 COMMON R2,J,K,N,RJQ(3),R6,RJ(16),NO,JQ(10),NN,LL /XRN/RN(1)
30100 JJ2=ITEM+1
30200 J=ITEM
30300 C NOW FIND WHICH STAVES CURRENTLY ACTIVE
30400 DO 1 K=0,7
30500 1 JQ(K)=0
30600 DO 2 K=1,J
30700 L=KWDS(K)
30800 2 JQ(IFIX(RN(L+2)))=-1
30900 JQ(IFIX(R2))=0
31000 C BUT OMIT SOURCE STAFF
31100 DO 3 K=1,J
31200 L=KWDS(K)
31300 IF(RTLINE(L).LT.0)GO TO 3
31400 C ON RIGHT LINE?
31500 IF(OUTLIM(L,3).LT.0)GO TO 3
31600 C WITHIN GIVEN LFT AND RT LIMITS?
31700 9 IF(RN(L+1).NE.R6)GO TO 3
31800 C FOUND A SOURCE ITEM (CODE# IN R11). NOW PUT IT ON ALL OTHER STAVES.
31900 7 NN=RN(L)+3
32000 C NUMBER OF NEW WORDS ADDED TO ARRAY
32100 DO 8 N=0,7
32200 IF(JQ(N).EQ.0)GO TO 8
32300 4 CALL LOOP(0,NN,1,I,L,RN)
32400 5 ITEM=ITEM+1
32500 LL=KWDS(ITEM)
32600 RN(LL+2)=N
32700 C PUT IN CORRECT STAFF NUM.
32800 6 I=I+NN
32900 C UPDATE XRN ARRAY COUNTER AND POINTER ARRAY.
33000 KWDS(ITEM+1)=I
33100 8 CONTINUE
33200 3 CONTINUE
33300 CC JJ2=ITEM+1
33400 END
33500
33600 SUBROUTINE CMDIN
33700 C SAVES INPUT LINES WHEN 1ST CHAR. IS : EACH STRING=23 CHARS.
33800 C OUTPUTS SAVED LINES WHEN 1ST CHAR. IS ;
33900 COMMON /ALF/INP(72)
34000 DIMENSION J(72)
34100 EQUIVALENCE (I1,INP),(I2,INP(2)),(I3,INP(3))
34200 IF(I1.EQ.';')GO TO 11
34300 C JUMP TO GET BACK COMMAND 1, 2 OR 3 (; ;; ;;;)
34400 N=2
34500 L=1
34600 LL=1
34700 10 NN=N+22
34800 DO 2 K=N,NN
34900 M=INP(K)
35000 IF(M.EQ.':')GO TO 3
35100 J(L)=M
35200 2 L=L+1
35300 IF(K.EQ.NN)GO TO 6
35400 3 DO 5 KK=K,NN
35500 J(L)=' '
35600 5 L=L+1
35700 4 IF(M.NE.':')GO TO 6
35800 C 3 COMMANDS CAN BE GIVEN ON ONE LINE, EACH STARTS WITH :
35900 C THE 1ST ONE WILL BE ACTIVATED IMMEDIATELY, OR BY TYPING ;
36000 C THE 2ND AND 3RD ARE ACTIVATED BY TYPING ;; OR ;;;
36100 C NO ERROR TRAP FOR MORE THEN 3 COLONS
36200 LL=LL+23
36300 L=LL
36400 N=K+1
36500 GO TO 10
36600 6 N=1
36700 9 NN=N+19
36800 L=0
36900 DO 7 K=N,NN
37000 L=L+1
37100 7 INP(L)=J(K)
37200 DO 8 K=24,72
37300 C CLEAR REST OF INP ARRAY
37400 8 INP(K)=' '
37500 RETURN
37600 11 N=1
37700 IF(I2.EQ.';')N=24
37800 IF(I3.EQ.';')N=47
37900 GO TO 9
38000 C GO GET BACK COMMAND 1, 2 OR 3 (; ;; ;;;)
38100 END